const Koa = require('koa');
const app = new Koa();

const Router = require('koa-router');
const router = new Router();
//所有的班级数据
const { list } = require('./data.js');

//====================================================================================
//解析post数据
function paresPostData(ctx) {
	return new Promise((resolve, reject) => {
		try {
			let postData = ''
			ctx.req.addListener('data', (data) => {
				postData += data
			})
			ctx.req.on('end', () => {
				if (ctx.request.header['content-type'] === 'application/json') {
					resolve(JSON.parse(postData))
				} else {
					resolve(parseData(postData))
				}
			})

		} catch (err) {
			reject(err)
		}
	})
}
//将键值类型的字符串转化为对象
function parseData(queryStr) {
	let queryData = {}
	let queryList = queryStr.split('&')
	for (let [index, queryItem] of queryList.entries()) {
		let itemList = queryItem.split('=')
		queryData[itemList[0]] = decodeURIComponent(itemList[1])
	}
	return queryData
}

//标准的数据返回
function rsp(data, msg = '成功', code = 10000) {
	return { code, msg, data }
}
//====================================================================================
//入口控制
app.use(async (ctx, next) => {
	//允许来自所有域名请求(不携带cookie请求可以用*，如果有携带cookie请求必须指定域名)
	ctx.set('Access-Control-Allow-Origin', '*');
	// 设置所允许的HTTP请求方法
	ctx.set('Access-Control-Allow-Methods', 'OPTIONS, GET, PUT, POST, DELETE');
	//字段是必需的。它也是一个逗号分隔的字符串，表明服务器支持的所有头信息字段.
	// 服务器收到请求以后，检查了Origin、Access-Control-Request-Method和Access-Control-Request-Headers
	// 字段以后，确认允许跨源请求，就可以做出回应。
	ctx.set('Access-Control-Allow-Headers', 'x-requested-with, accept, origin, content-type');
	// 该字段可选。它的值是一个布尔值，表示是否允许发送Cookie。默认情况下，Cookie不包括在CORS请求之中。
	// 当设置成允许请求携带cookie时，需要保证"Access-Control-Allow-Origin"是服务器有的域名，而不能是"*";
	ctx.set('Access-Control-Allow-Credentials', true);
	await next();
});
//获取全校列表数据
router.get('/api/class/list', (ctx, next) => {
	ctx.set('Access-Control-Allow-Origin', '*');
	ctx.body = rsp({
		list,
		//当前页码
		page: 1,
		limit: 10,
		//总共查询到的条数
		total: list.length
	})
})
//编辑或新增班级数据
router.post('/api/class/set', async (ctx, next) => {
	let { id, ...param } = await paresPostData(ctx);
	let msg = '';
	if (id) {
		//如果id存在，则为修改操作
		//根据ID找到该班级
		let cs = list.find(cs => cs.id === Number(id));
		Object.assign(cs, param);
		msg = '编辑成功';
	} else {
		//如果id不存在，则为新增操作
		//构造新的id,需要找到班级最大的id
		let id = 0;
		list.forEach(cs => {
			if (id < cs.id) id = cs.id + 1;
		})
		//对新增的班级编号
		param.id = id;
		//开班
		list.push(param);
		msg = '新增成功';
	}
	//操作成功的响应
	ctx.body = rsp({}, msg);
})

app
.use(router.routes())
.use(router.allowedMethods());


app.listen(3000, _ => console.log('run : 3000'))
